package com.yxw.yx_hotel.controller;

import com.yxw.yx_hotel.dto.RoleAddDTO;
import com.yxw.yx_hotel.dto.RoleDeleteDTO;
import com.yxw.yx_hotel.dto.RoleQueryDTO;
import com.yxw.yx_hotel.dto.RoleUpdateDTO;
import com.yxw.yx_hotel.entity.YxCsRoleMenuEntity;
import com.yxw.yx_hotel.service.IRoleService;
import com.yxw.yx_hotel.vo.RoleVO;
import com.yxw.yx_hotel.vo.YxCsMenuVo;
import com.yxw.yxnet_cd_center.common.dto.PageVO;
import com.yxw.yxnet_cd_center.common.helper.ResultHelper;
import com.yxw.yxnet_cd_center.common.utils.BaseResult;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

import java.util.List;

/**
 * 角色管理Controller控制层处理
 *
 * @author xiexuxin
 * @date 2023-09-18
 */
@Slf4j
@Api(value = "角色管理", tags = "角色管理")
@RestController
@Validated
@RequestMapping("/api/role")
public class RoleController {

    @Autowired
    private IRoleService roleService;

    /**
     * 新增角色
     */
    @ApiOperation("添加角色")
    @PostMapping("add_role")
    public BaseResult addRole(@RequestBody RoleAddDTO roleDTO) {
        log.info("开始处理【添加角色】的请求，参数：{}", roleDTO);
        roleService.addRole(roleDTO);
        return BaseResult.success();
    }

    /**
     * 删除角色
     */
    @ApiOperation("删除角色")
    @PostMapping("/batch_delete")
    public BaseResult batchDelete(@RequestBody RoleDeleteDTO deleteDTO) {
        log.info("开始处理【根据id批量删除角色】的请求，参数：{}", deleteDTO);
        roleService.deleteByRoleIds(deleteDTO);
        return BaseResult.success();
    }

    /**
     * 角色启用/禁用
     */
    @ApiOperation(value = "角色启用/禁用")
    @PostMapping(value = "/update_role_status_by_id")
    public BaseResult updateRoleStatusById(@RequestParam("roleId") Long roleId) {
        log.info("开始处理【角色启用/禁用】的请求，角色id:{}", roleId);
        roleService.updateRoleStatusById(roleId);
        return BaseResult.doSuccess(null, "设置成功");
    }

    /**
     * 角色编辑权限
     */
    @ApiOperation(value = "角色编辑权限")
    @PostMapping("/edit_role")
    public BaseResult editRolePermissions(@RequestBody YxCsRoleMenuEntity roleMenus) {
        roleService.updateRoleMenuByRoleId(roleMenus);
        return BaseResult.success();
    }

    /**
     * 修改角色
     */
    @ApiOperation("根据id修改角色")
    @PostMapping("/update")
    public BaseResult edit(@RequestBody RoleUpdateDTO roleDTO) {
        log.info("开始处理【根据id修改角色】的请求，参数：{}",roleDTO);
        roleService.updateRole(roleDTO);
        return BaseResult.success();
    }

    /**
     * 根据id查询角色信息
     */
    @ApiOperation(value = "根据id查询角色信息")
    @GetMapping(value = "/select_role")
    public BaseResult getInfo(@RequestParam("roleId") Long roleId) {
        log.info("开始处理【根据id查询角色信息】的请求，ID：{}", roleId);
        RoleVO roleVO = roleService.selectRoleById(roleId);
        return BaseResult.success(roleVO);
    }

    /**
     * 查询角色列表
     */
    @ApiOperation(value = "查询角色列表")
    @PostMapping("/role_list")
    public BaseResult roleList() {
        log.info("开始处理【查询角色列表】请求， 无参数");
        List<RoleVO> list = roleService.roleList();
        return BaseResult.success(list);
    }

    /**
     * 查询启用角色列表
     */
    @ApiOperation(value = "查询启用角色列表")
    @PostMapping("/role_list_by_status")
    public BaseResult roleListByStatus() {
        log.info("开始处理【查询角色列表】请求， 无参数");
        List<RoleVO> list = roleService.roleListByStatus();
        return BaseResult.success(list);
    }

    /**
     *条件查询角色列表
     */
    @ApiOperation(value = "条件查询角色")
    @PostMapping(value = "/get_role_list")
    public BaseResult<PageVO<RoleVO>> getRoleList(@RequestBody RoleQueryDTO roleQueryDTO) {
        log.info("开始处理【查询角色列表】请求，参数:{}",roleQueryDTO);
        PageVO<RoleVO> pageVo=roleService.getRoleList(roleQueryDTO);
        return ResultHelper.fillWithSuccess(pageVo);
    }

    /**
     * 加载对应角色菜单列表树
     */
    @PostMapping("/get_menu_tree_by_role_menu")
    @ApiOperation(value = "加载对应角色菜单列表树")
    public BaseResult getMenuTreeByUserRole(@RequestParam("roleId") Long roleId) {
        List<YxCsMenuVo> menuList = roleService.getMenuTreeByRoleMenu(roleId);
        return BaseResult.success(menuList);
    }

}
